package cn.com.dcsgo.service.impl;

import cn.com.dcsgo.constant.CacheConstant;
import cn.com.dcsgo.dto.PageDTO;
import cn.com.dcsgo.dto.ProdTagAddDTO;
import cn.com.dcsgo.dto.ProdTagQueryDTO;
import cn.com.dcsgo.dto.ProdTagUpdateDTO;
import cn.com.dcsgo.exception.BusinessException;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.com.dcsgo.domain.ProdTag;
import cn.com.dcsgo.service.ProdTagService;
import cn.com.dcsgo.mapper.ProdTagMapper;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;

/**
 * 针对表【prod_tag(商品分组表)】的数据库操作Service实现
 *
 * @author Dcsgo
 * @since 2025-10-14 08:45:30
 */
@Service
@CacheConfig(cacheNames = "cn.com.dcsgo.service.impl.ProdTagServiceImpl")
public class ProdTagServiceImpl extends ServiceImpl<ProdTagMapper, ProdTag>
        implements ProdTagService {

    @Override
    public Page<ProdTag> getProdTagPage(PageDTO pageDTO, ProdTagQueryDTO prodTagQueryDTO) {
        Page<ProdTag> page = new Page<>(pageDTO.getCurrent(), pageDTO.getSize());
        return baseMapper.selectPage(page,
                new LambdaQueryWrapper<ProdTag>()
                        .eq(prodTagQueryDTO.getStatus() != null, ProdTag::getStatus, prodTagQueryDTO.getStatus())
                        .like(StringUtils.hasText(prodTagQueryDTO.getTitle()), ProdTag::getTitle, prodTagQueryDTO.getTitle())
                        .orderByAsc(ProdTag::getSeq)
        );
    }

    /**
     * 活动名是否已存在
     *
     * @param title 活动名
     * @return true 已存在，false 不存在
     */
    public boolean existsByTitle(String title) {
        return baseMapper.exists(
                new LambdaQueryWrapper<ProdTag>()
                        .eq(ProdTag::getTitle, title)
        );
    }

    @Override
    @CacheEvict(key = CacheConstant.ALL_NORMAL_TAG)
    public boolean save(ProdTagAddDTO prodTagAddDTO) {
        //活动名不能重复
        if (existsByTitle(prodTagAddDTO.getTitle())) {
            throw new BusinessException("活动名【" + prodTagAddDTO.getTitle() + "】已存在");
        }
        ProdTag saveData = new ProdTag();
        BeanUtil.copyProperties(prodTagAddDTO, saveData);
        saveData.setCreateTime(new Date());
        int row = baseMapper.insert(saveData);
        return row > 0;
    }

    @Override
    @CacheEvict(key = CacheConstant.ALL_NORMAL_TAG)
    public boolean update(ProdTagUpdateDTO prodTagUpdateDTO) {
        //活动名不能重复
        ProdTag oldData = baseMapper.selectById(prodTagUpdateDTO.getId());
        if (prodTagUpdateDTO.getTitle() != null
                && !prodTagUpdateDTO.getTitle().equals(oldData.getTitle())
                && existsByTitle(prodTagUpdateDTO.getTitle())) {
            throw new BusinessException("活动名【" + prodTagUpdateDTO.getTitle() + "】已存在");
        }
        ProdTag updateData = new ProdTag();
        BeanUtil.copyProperties(prodTagUpdateDTO, updateData);
        updateData.setUpdateTime(new Date());
        int row = baseMapper.updateById(updateData);
        return row > 0;
    }

    @Override
    @CacheEvict(key = CacheConstant.ALL_NORMAL_TAG)
    public boolean carefulRemoveById(Long id) {
        ProdTag selected = baseMapper.selectById(id);
        if (selected == null) {
            throw new BusinessException("活动不存在");
        }
        if (selected.getStatus().equals(1)) {
            throw new BusinessException("不允许删除状态为正常的活动");
        }
        return baseMapper.deleteById(id) > 0;
    }

    @Override
    @Cacheable(key = CacheConstant.ALL_NORMAL_TAG)
    public List<ProdTag> getAllNormalProdTag() {
        return baseMapper.selectList(
                new LambdaQueryWrapper<ProdTag>()
                        .eq(ProdTag::getStatus,1)
                        .orderByAsc(ProdTag::getSeq)
        );
    }
}




